home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
datelib.exe
/
CALCTIME.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-27
|
4KB
|
154 lines
static char calctime_prog[] = "@(#)Zeit +/- Zahl";
static char calctime_ver[] = "@(#)v1.00/kr ; 10.06.91";
/* calctime Rechnen mit Zeiten
**
** Autor Klaus Rath
**
** Deklaration char *calctime(char *zeit, long abstand, char *erg);
**
** Übergabe Die Funktion erwartet einen String in einem der folgenden
** Formate :
** hh:mm[:ss] -- Formate 1,2
** hh.mm[.ss] -- Formate 3,4
** hhmm[ss] -- Datenbankformate 5,6
** sowie einen long-Wert, dessen Vorzeichen die gewünschte
** Operation festlegt.
** Rückgabe Zeiger auf ein char-Array erg, daß ausreichend dimensioniert
** sein muß - calctime gibt immer im langen Format zurück.
** Für deutsches und amerikanisches Format werden also 9,
** fürs DDB/4-Format 7 Zeichen benötigt!
**
** Anmerkungen
**
** Änderungen 1.00 ; 10.06.91
** - Erste Version
*/
#include <stdio.h>
#include <string.h>
#include <time.h>
#ifdef __TURBOC__
#define ANSI
#define MSDOS
#include <stdlib.h>
#include <sys\types.h>
#else
#include <sys/types.h>
#endif
#include "datum.h"
#ifdef ANSI
char *calctime(char *tstring, long abstand, char *erg)
#else
char *calctime(tstring,abstand,erg)
char *tstring;
long abstand;
char *erg;
#endif
{
char stunden_s[3],minuten_s[3],sekunden_s[3];
long stunden, minuten, sekunden;
long gesamt;
int format;
int zaehler;
gesamt = 0L;
/* Überprüfung auf Gültigkeit bzw. Format :
*/
format = checktime(tstring);
if ( !format ) {
return(NULL);
}
/* Format überprüfen und umkopieren :
*/
if ( format >= 1 && format <= 4 ) {
stunden_s[0] = tstring[0];
stunden_s[1] = tstring[1];
stunden_s[2] = '\0';
minuten_s[0] = tstring[3];
minuten_s[1] = tstring[4];
minuten_s[2] = '\0';
if ( format == 2 || format == 4 ) {
sekunden_s[0] = tstring[6];
sekunden_s[1] = tstring[7];
sekunden_s[2] = '\0';
}
else {
sekunden_s[0] = '0';
sekunden_s[1] = '0';
sekunden_s[2] = '\0';
}
} /* ENDE: Formate 1-4 */
else if ( format == 5 || format == 6 ) { /* Datenbank-Format */
stunden_s[0] = tstring[0];
stunden_s[1] = tstring[1];
stunden_s[2] = '\0';
minuten_s[0] = tstring[2];
minuten_s[1] = tstring[3];
minuten_s[2] = '\0';
if ( format == 6 ) {
sekunden_s[0] = tstring[4];
sekunden_s[1] = tstring[5];
sekunden_s[2] = '\0';
}
else {
sekunden_s[0] = '0';
sekunden_s[1] = '0';
sekunden_s[2] = '\0';
}
} /* ENDE: Datenbankformat */
/* ENDE:if(Formatprüfung und Kopierung) */
/* Konvertierung und Summation :
*/
stunden = atol(stunden_s);
minuten = atol(minuten_s);
gesamt = (stunden*60L) + minuten;
/* Rückgabeformat auf das passende Langformat einstellen :
*/
switch ( format ) {
case TI_HM_D:
case TI_HMS_D:
format = TI_HMS_D;
break;
case TI_HM_P:
case TI_HMS_P:
format = TI_HMS_P;
break;
case TI_HM_DB:
case TI_HMS_DB:
format = TI_HMS_DB;
break;
default: format = TI_HMS_D;
}
/* Aktion ermitteln :
*/
if ( abstand == 0 ) {
cnvttime(tstring,format,erg);
return(erg);
}
else if ( abstand > 0 ) { /* Addition */
gesamt += abstand;
if ( gesamt > TI_MAX_MIN )
strcpy(erg,TI_MAX_VAL);
else
strcpy(erg,mk_timestr(gesamt,'m',format));
return(erg);
} /* ENDE: abstand > 0 */
else if ( abstand < 0 ) { /* Subtraktion */
abstand = abstand*(-1L);
gesamt -= abstand;
if ( gesamt < 0L )
gesamt = 0L;
strcpy(erg,mk_timestr(gesamt,'m',format));
return(erg);
} /* ENDE: abstand */
return(NULL);
} /* ENDE: calctime() */